``` #include <sys/syscall.h> #include <unistd.h> #include <stdio.h> int main(void) { /* 直接按调用号发起getpid,绕过glibc包装,rax=39 */ pid_t pid = syscall(SYS_getpid); printf("pid=%d\n", pid); return 0; } ``` 内联等价约定(理解用):把号写入 `rax`,参数依次摆入 `rdi/rsi/rdx/r10/r8/r9`,执行 `syscall`,内核按 `rax` 查系统调用表分发,结果经 `rax` 返回,再由 `sysret` 回到用户态。`syscall()` 库函数只是替你完成摆寄存器与陷入,调用号与传参位置不变。 ``` # 两种写法在strace下看到同一调用号陷入 strace -e trace=getpid ./程序 ```